Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Raw • Download


visualiser-wasm/cmd/wasm/main.go 9f75e3db181925ddd253f7fb231af81f9fb8c013 (9f75e3db) Text, 8.82 KB

T8b949e// SPDX-License-Identifier: 0BSD

T8b949e// Command wasm exposes network visualiser hot-path helpers to the browser.
Tff7b72package Te6edf3main

Tff7b72import Tb4b4b4(
Ta5d6ff"encoding/json"
Ta5d6ff"syscall/js"
Ta5d6ff"unsafe"

Ta5d6ff"github.com/Quad4-Software/MeshChatX/visualiser-wasm/internal/filter"
Ta5d6ff"github.com/Quad4-Software/MeshChatX/visualiser-wasm/internal/graph"
Ta5d6ff"github.com/Quad4-Software/MeshChatX/visualiser-wasm/internal/icon"
Ta5d6ff"github.com/Quad4-Software/MeshChatX/visualiser-wasm/internal/layout"
Ta5d6ff"github.com/Quad4-Software/MeshChatX/visualiser-wasm/internal/lod"
Ta5d6ff"github.com/Quad4-Software/MeshChatX/visualiser-wasm/internal/scene"
Tb4b4b4)

Tff7b72const Te6edf3apiVersion Tb4b4b4= Ta5d6ff"1.2.0"

Tff7b72var Te6edf3visualiserScene Tb4b4b4= Te6edf3sceneTb4b4b4.Te6edf3NewTb4b4b4(Tb4b4b4)

Tff7b72var Tb4b4b4(
Te6edf3nodeDrawScratch Tb4b4b4[Tb4b4b4]Tffa657float32
Te6edf3edgeDrawScratch Tb4b4b4[Tb4b4b4]Tffa657float32
Tb4b4b4)

Tff7b72func Te6edf3mainTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3jsTb4b4b4.Te6edf3GlobalTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3SetTb4b4b4(Ta5d6ff"meshchatxVisualiserVersion"Tb4b4b4, Te6edf3apiVersionTb4b4b4)
Te6edf3jsTb4b4b4.Te6edf3GlobalTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3SetTb4b4b4(Ta5d6ff"meshchatxVisualiserPathHashes"Tb4b4b4, Te6edf3jsTb4b4b4.Te6edf3FuncOfTb4b4b4(Te6edf3wrapJSONTb4b4b4(Te6edf3pathHashesHandlerTb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3jsTb4b4b4.Te6edf3GlobalTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3SetTb4b4b4(Ta5d6ff"meshchatxVisualiserDedupeIcons"Tb4b4b4, Te6edf3jsTb4b4b4.Te6edf3FuncOfTb4b4b4(Te6edf3wrapJSONTb4b4b4(Te6edf3dedupeIconsHandlerTb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3jsTb4b4b4.Te6edf3GlobalTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3SetTb4b4b4(Ta5d6ff"meshchatxVisualiserBuildPathGraph"Tb4b4b4, Te6edf3jsTb4b4b4.Te6edf3FuncOfTb4b4b4(Te6edf3wrapJSONTb4b4b4(Te6edf3buildPathGraphHandlerTb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3jsTb4b4b4.Te6edf3GlobalTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3SetTb4b4b4(Ta5d6ff"meshchatxVisualiserBuildFullGraph"Tb4b4b4, Te6edf3jsTb4b4b4.Te6edf3FuncOfTb4b4b4(Te6edf3wrapJSONTb4b4b4(Te6edf3buildFullGraphHandlerTb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3jsTb4b4b4.Te6edf3GlobalTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3SetTb4b4b4(Ta5d6ff"meshchatxVisualiserLayout"Tb4b4b4, Te6edf3jsTb4b4b4.Te6edf3FuncOfTb4b4b4(Te6edf3wrapJSONTb4b4b4(Te6edf3layoutHandlerTb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3jsTb4b4b4.Te6edf3GlobalTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3SetTb4b4b4(Ta5d6ff"meshchatxVisualiserLODUpdates"Tb4b4b4, Te6edf3jsTb4b4b4.Te6edf3FuncOfTb4b4b4(Te6edf3wrapJSONTb4b4b4(Te6edf3lodUpdatesHandlerTb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3jsTb4b4b4.Te6edf3GlobalTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3SetTb4b4b4(Ta5d6ff"meshchatxVisualiserLODLevel"Tb4b4b4, Te6edf3jsTb4b4b4.Te6edf3FuncOfTb4b4b4(Te6edf3lodLevelHandlerTb4b4b4)Tb4b4b4)

Te6edf3jsTb4b4b4.Te6edf3GlobalTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3SetTb4b4b4(Ta5d6ff"meshchatxVisualiserSceneSet"Tb4b4b4, Te6edf3jsTb4b4b4.Te6edf3FuncOfTb4b4b4(Te6edf3wrapJSONTb4b4b4(Te6edf3sceneSetHandlerTb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3jsTb4b4b4.Te6edf3GlobalTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3SetTb4b4b4(Ta5d6ff"meshchatxVisualiserSceneTick"Tb4b4b4, Te6edf3jsTb4b4b4.Te6edf3FuncOfTb4b4b4(Te6edf3sceneTickHandlerTb4b4b4)Tb4b4b4)
Te6edf3jsTb4b4b4.Te6edf3GlobalTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3SetTb4b4b4(Ta5d6ff"meshchatxVisualiserSceneResize"Tb4b4b4, Te6edf3jsTb4b4b4.Te6edf3FuncOfTb4b4b4(Te6edf3sceneResizeHandlerTb4b4b4)Tb4b4b4)
Te6edf3jsTb4b4b4.Te6edf3GlobalTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3SetTb4b4b4(Ta5d6ff"meshchatxVisualiserSceneSetCamera"Tb4b4b4, Te6edf3jsTb4b4b4.Te6edf3FuncOfTb4b4b4(Te6edf3sceneSetCameraHandlerTb4b4b4)Tb4b4b4)
Te6edf3jsTb4b4b4.Te6edf3GlobalTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3SetTb4b4b4(Ta5d6ff"meshchatxVisualiserScenePanBy"Tb4b4b4, Te6edf3jsTb4b4b4.Te6edf3FuncOfTb4b4b4(Te6edf3scenePanByHandlerTb4b4b4)Tb4b4b4)
Te6edf3jsTb4b4b4.Te6edf3GlobalTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3SetTb4b4b4(Ta5d6ff"meshchatxVisualiserSceneZoomAt"Tb4b4b4, Te6edf3jsTb4b4b4.Te6edf3FuncOfTb4b4b4(Te6edf3sceneZoomAtHandlerTb4b4b4)Tb4b4b4)
Te6edf3jsTb4b4b4.Te6edf3GlobalTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3SetTb4b4b4(Ta5d6ff"meshchatxVisualiserScenePick"Tb4b4b4, Te6edf3jsTb4b4b4.Te6edf3FuncOfTb4b4b4(Te6edf3scenePickHandlerTb4b4b4)Tb4b4b4)
Te6edf3jsTb4b4b4.Te6edf3GlobalTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3SetTb4b4b4(Ta5d6ff"meshchatxVisualiserSceneDragStart"Tb4b4b4, Te6edf3jsTb4b4b4.Te6edf3FuncOfTb4b4b4(Te6edf3sceneDragStartHandlerTb4b4b4)Tb4b4b4)
Te6edf3jsTb4b4b4.Te6edf3GlobalTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3SetTb4b4b4(Ta5d6ff"meshchatxVisualiserSceneDragTo"Tb4b4b4, Te6edf3jsTb4b4b4.Te6edf3FuncOfTb4b4b4(Te6edf3sceneDragToHandlerTb4b4b4)Tb4b4b4)
Te6edf3jsTb4b4b4.Te6edf3GlobalTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3SetTb4b4b4(Ta5d6ff"meshchatxVisualiserSceneDragEnd"Tb4b4b4, Te6edf3jsTb4b4b4.Te6edf3FuncOfTb4b4b4(Te6edf3sceneDragEndHandlerTb4b4b4)Tb4b4b4)
Te6edf3jsTb4b4b4.Te6edf3GlobalTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3SetTb4b4b4(Ta5d6ff"meshchatxVisualiserSceneGetCamera"Tb4b4b4, Te6edf3jsTb4b4b4.Te6edf3FuncOfTb4b4b4(Te6edf3wrapJSONTb4b4b4(Te6edf3sceneGetCameraHandlerTb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3jsTb4b4b4.Te6edf3GlobalTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3SetTb4b4b4(Ta5d6ff"meshchatxVisualiserSceneGetPositions"Tb4b4b4, Te6edf3jsTb4b4b4.Te6edf3FuncOfTb4b4b4(Te6edf3wrapJSONTb4b4b4(Te6edf3sceneGetPositionsHandlerTb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3jsTb4b4b4.Te6edf3GlobalTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3SetTb4b4b4(Ta5d6ff"meshchatxVisualiserSceneCounts"Tb4b4b4, Te6edf3jsTb4b4b4.Te6edf3FuncOfTb4b4b4(Te6edf3wrapJSONTb4b4b4(Te6edf3sceneCountsHandlerTb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3jsTb4b4b4.Te6edf3GlobalTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3SetTb4b4b4(Ta5d6ff"meshchatxVisualiserSceneGetDrawBuffers"Tb4b4b4, Te6edf3jsTb4b4b4.Te6edf3FuncOfTb4b4b4(Te6edf3sceneGetDrawBuffersHandlerTb4b4b4)Tb4b4b4)

Tff7b72select Tb4b4b4{Tb4b4b4}
Tb4b4b4}

Tff7b72type Te6edf3handlerFunc Tff7b72funcTb4b4b4(Te6edf3args Tb4b4b4[Tb4b4b4]Te6edf3jsTb4b4b4.Te6edf3ValueTb4b4b4) Tb4b4b4(Tffa657anyTb4b4b4, Tffa657errorTb4b4b4)

Tff7b72func Te6edf3wrapJSONTb4b4b4(Te6edf3fn Te6edf3handlerFuncTb4b4b4) Tff7b72funcTb4b4b4(Te6edf3jsTb4b4b4.Te6edf3ValueTb4b4b4, Tb4b4b4[Tb4b4b4]Te6edf3jsTb4b4b4.Te6edf3ValueTb4b4b4) Tffa657any Tb4b4b4{
Tff7b72return Tff7b72funcTb4b4b4(Te6edf3_ Te6edf3jsTb4b4b4.Te6edf3ValueTb4b4b4, Te6edf3args Tb4b4b4[Tb4b4b4]Te6edf3jsTb4b4b4.Te6edf3ValueTb4b4b4) Tffa657any Tb4b4b4{
Te6edf3outTb4b4b4, Te6edf3err Tff7b72:= Te6edf3fnTb4b4b4(Te6edf3argsTb4b4b4)
Tff7b72if Te6edf3err Tff7b72!= Tff7b72nil Tb4b4b4{
Tff7b72return Te6edf3jsTb4b4b4.Te6edf3ValueOfTb4b4b4(Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tffa657anyTb4b4b4{
Ta5d6ff"ok"Tb4b4b4: Tff7b72falseTb4b4b4,
Ta5d6ff"error"Tb4b4b4: Te6edf3errTb4b4b4.Te6edf3ErrorTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4)
Tb4b4b4}
Te6edf3bufTb4b4b4, Te6edf3err Tff7b72:= Te6edf3jsonTb4b4b4.Te6edf3MarshalTb4b4b4(Te6edf3outTb4b4b4)
Tff7b72if Te6edf3err Tff7b72!= Tff7b72nil Tb4b4b4{
Tff7b72return Te6edf3jsTb4b4b4.Te6edf3ValueOfTb4b4b4(Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tffa657anyTb4b4b4{
Ta5d6ff"ok"Tb4b4b4: Tff7b72falseTb4b4b4,
Ta5d6ff"error"Tb4b4b4: Te6edf3errTb4b4b4.Te6edf3ErrorTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4)
Tb4b4b4}
Tff7b72return Te6edf3jsTb4b4b4.Te6edf3ValueOfTb4b4b4(Tffa657stringTb4b4b4(Te6edf3bufTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tff7b72func Te6edf3readJSONArgTb4b4b4(Te6edf3args Tb4b4b4[Tb4b4b4]Te6edf3jsTb4b4b4.Te6edf3ValueTb4b4b4, Te6edf3idx Tffa657intTb4b4b4, Te6edf3dest Tffa657anyTb4b4b4) Tffa657error Tb4b4b4{
Tff7b72if Te6edf3idx Tff7b72>= Tffa657lenTb4b4b4(Te6edf3argsTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3errMissingArg
Tb4b4b4}
Te6edf3raw Tff7b72:= Te6edf3argsTb4b4b4[Te6edf3idxTb4b4b4]Tb4b4b4.Te6edf3StringTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3jsonTb4b4b4.Te6edf3UnmarshalTb4b4b4(Tb4b4b4[Tb4b4b4]Tffa657byteTb4b4b4(Te6edf3rawTb4b4b4)Tb4b4b4, Te6edf3destTb4b4b4)
Tb4b4b4}

Tff7b72var Te6edf3errMissingArg Tb4b4b4= Te6edf3errStringTb4b4b4(Ta5d6ff"missing json argument"Tb4b4b4)

Tff7b72type Te6edf3errString Tffa657string

Tff7b72func Tb4b4b4(Te6edf3e Te6edf3errStringTb4b4b4) Te6edf3ErrorTb4b4b4(Tb4b4b4) Tffa657string Tb4b4b4{ Tff7b72return Tffa657stringTb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4}

Tff7b72func Te6edf3pathHashesHandlerTb4b4b4(Te6edf3args Tb4b4b4[Tb4b4b4]Te6edf3jsTb4b4b4.Te6edf3ValueTb4b4b4) Tb4b4b4(Tffa657anyTb4b4b4, Tffa657errorTb4b4b4) Tb4b4b4{
Tff7b72var Te6edf3pathTable Tb4b4b4[Tb4b4b4]Te6edf3filterTb4b4b4.Te6edf3PathEntry
Tff7b72if Te6edf3err Tff7b72:= Te6edf3readJSONArgTb4b4b4(Te6edf3argsTb4b4b4, T79c0ff0Tb4b4b4, Tff7b72&Te6edf3pathTableTb4b4b4)Tb4b4b4; Te6edf3err Tff7b72!= Tff7b72nil Tb4b4b4{
Tff7b72return Tff7b72nilTb4b4b4, Te6edf3err
Tb4b4b4}
Tff7b72var Te6edf3hopMax Tff7b72*Tffa657float64
Tff7b72if Tffa657lenTb4b4b4(Te6edf3argsTb4b4b4) Tb4b4b4> T79c0ff1 Tff7b72&& Tb4b4b4!Te6edf3argsTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4.Te6edf3IsNullTb4b4b4(Tb4b4b4) Tff7b72&& Tb4b4b4!Te6edf3argsTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4.Te6edf3IsUndefinedTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Te6edf3argsTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4.Te6edf3TypeTb4b4b4(Tb4b4b4) Tff7b72== Te6edf3jsTb4b4b4.Te6edf3TypeNumber Tb4b4b4{
Te6edf3v Tff7b72:= Te6edf3argsTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4.Te6edf3FloatTb4b4b4(Tb4b4b4)
Te6edf3hopMax Tb4b4b4= Tff7b72&Te6edf3v
Tb4b4b4} Tff7b72else Tff7b72if Te6edf3argsTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4.Te6edf3TypeTb4b4b4(Tb4b4b4) Tff7b72== Te6edf3jsTb4b4b4.Te6edf3TypeString Tb4b4b4{
Te6edf3s Tff7b72:= Te6edf3argsTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4.Te6edf3StringTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3s Tff7b72!= Ta5d6ff"" Tff7b72&& Te6edf3s Tff7b72!= Ta5d6ff"null" Tb4b4b4{
Tff7b72var Te6edf3v Tffa657float64
Tff7b72if Te6edf3err Tff7b72:= Te6edf3jsonTb4b4b4.Te6edf3UnmarshalTb4b4b4(Tb4b4b4[Tb4b4b4]Tffa657byteTb4b4b4(Te6edf3sTb4b4b4)Tb4b4b4, Tff7b72&Te6edf3vTb4b4b4)Tb4b4b4; Te6edf3err Tff7b72== Tff7b72nil Tb4b4b4{
Te6edf3hopMax Tb4b4b4= Tff7b72&Te6edf3v
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3filterTb4b4b4.Te6edf3PathHashesWithinHopFilterTb4b4b4(Te6edf3pathTableTb4b4b4, Te6edf3hopMaxTb4b4b4)Tb4b4b4, Tff7b72nil
Tb4b4b4}

Tff7b72func Te6edf3dedupeIconsHandlerTb4b4b4(Te6edf3args Tb4b4b4[Tb4b4b4]Te6edf3jsTb4b4b4.Te6edf3ValueTb4b4b4) Tb4b4b4(Tffa657anyTb4b4b4, Tffa657errorTb4b4b4) Tb4b4b4{
Tff7b72var Te6edf3queue Tb4b4b4[Tb4b4b4]Te6edf3iconTb4b4b4.Te6edf3QueueItem
Tff7b72if Te6edf3err Tff7b72:= Te6edf3readJSONArgTb4b4b4(Te6edf3argsTb4b4b4, T79c0ff0Tb4b4b4, Tff7b72&Te6edf3queueTb4b4b4)Tb4b4b4; Te6edf3err Tff7b72!= Tff7b72nil Tb4b4b4{
Tff7b72return Tff7b72nilTb4b4b4, Te6edf3err
Tb4b4b4}
Tff7b72return Te6edf3iconTb4b4b4.Te6edf3DedupeQueueEntriesTb4b4b4(Te6edf3queueTb4b4b4)Tb4b4b4, Tff7b72nil
Tb4b4b4}

Tff7b72func Te6edf3buildPathGraphHandlerTb4b4b4(Te6edf3args Tb4b4b4[Tb4b4b4]Te6edf3jsTb4b4b4.Te6edf3ValueTb4b4b4) Tb4b4b4(Tffa657anyTb4b4b4, Tffa657errorTb4b4b4) Tb4b4b4{
Tff7b72var Te6edf3req Te6edf3graphTb4b4b4.Te6edf3Request
Tff7b72if Te6edf3err Tff7b72:= Te6edf3readJSONArgTb4b4b4(Te6edf3argsTb4b4b4, T79c0ff0Tb4b4b4, Tff7b72&Te6edf3reqTb4b4b4)Tb4b4b4; Te6edf3err Tff7b72!= Tff7b72nil Tb4b4b4{
Tff7b72return Tff7b72nilTb4b4b4, Te6edf3err
Tb4b4b4}
Tff7b72return Te6edf3graphTb4b4b4.Te6edf3BuildPathGraphTb4b4b4(Te6edf3reqTb4b4b4)Tb4b4b4, Tff7b72nil
Tb4b4b4}

Tff7b72func Te6edf3buildFullGraphHandlerTb4b4b4(Te6edf3args Tb4b4b4[Tb4b4b4]Te6edf3jsTb4b4b4.Te6edf3ValueTb4b4b4) Tb4b4b4(Tffa657anyTb4b4b4, Tffa657errorTb4b4b4) Tb4b4b4{
Tff7b72var Te6edf3req Te6edf3graphTb4b4b4.Te6edf3FullRequest
Tff7b72if Te6edf3err Tff7b72:= Te6edf3readJSONArgTb4b4b4(Te6edf3argsTb4b4b4, T79c0ff0Tb4b4b4, Tff7b72&Te6edf3reqTb4b4b4)Tb4b4b4; Te6edf3err Tff7b72!= Tff7b72nil Tb4b4b4{
Tff7b72return Tff7b72nilTb4b4b4, Te6edf3err
Tb4b4b4}
Tff7b72return Te6edf3graphTb4b4b4.Te6edf3BuildFullGraphTb4b4b4(Te6edf3reqTb4b4b4)Tb4b4b4, Tff7b72nil
Tb4b4b4}

Tff7b72func Te6edf3layoutHandlerTb4b4b4(Te6edf3args Tb4b4b4[Tb4b4b4]Te6edf3jsTb4b4b4.Te6edf3ValueTb4b4b4) Tb4b4b4(Tffa657anyTb4b4b4, Tffa657errorTb4b4b4) Tb4b4b4{
Tff7b72var Te6edf3req Te6edf3layoutTb4b4b4.Te6edf3Request
Tff7b72if Te6edf3err Tff7b72:= Te6edf3readJSONArgTb4b4b4(Te6edf3argsTb4b4b4, T79c0ff0Tb4b4b4, Tff7b72&Te6edf3reqTb4b4b4)Tb4b4b4; Te6edf3err Tff7b72!= Tff7b72nil Tb4b4b4{
Tff7b72return Tff7b72nilTb4b4b4, Te6edf3err
Tb4b4b4}
Tff7b72return Te6edf3layoutTb4b4b4.Te6edf3SettleTb4b4b4(Te6edf3reqTb4b4b4)Tb4b4b4, Tff7b72nil
Tb4b4b4}

Tff7b72func Te6edf3lodUpdatesHandlerTb4b4b4(Te6edf3args Tb4b4b4[Tb4b4b4]Te6edf3jsTb4b4b4.Te6edf3ValueTb4b4b4) Tb4b4b4(Tffa657anyTb4b4b4, Tffa657errorTb4b4b4) Tb4b4b4{
Tff7b72var Te6edf3payload Tff7b72struct Tb4b4b4{
Te6edf3Nodes Tb4b4b4[Tb4b4b4]Te6edf3lodTb4b4b4.Te6edf3NodeIn Ta5d6ff`json:"nodes"`
Te6edf3LOD Tffa657string Ta5d6ff`json:"lod"`
Te6edf3DarkMode Tffa657bool Ta5d6ff`json:"dark_mode"`
Tb4b4b4}
Tff7b72if Te6edf3err Tff7b72:= Te6edf3readJSONArgTb4b4b4(Te6edf3argsTb4b4b4, T79c0ff0Tb4b4b4, Tff7b72&Te6edf3payloadTb4b4b4)Tb4b4b4; Te6edf3err Tff7b72!= Tff7b72nil Tb4b4b4{
Tff7b72return Tff7b72nilTb4b4b4, Te6edf3err
Tb4b4b4}
Tff7b72return Te6edf3lodTb4b4b4.Te6edf3ComputeUpdatesTb4b4b4(Te6edf3payloadTb4b4b4.Te6edf3NodesTb4b4b4, Te6edf3payloadTb4b4b4.Te6edf3LODTb4b4b4, Te6edf3payloadTb4b4b4.Te6edf3DarkModeTb4b4b4)Tb4b4b4, Tff7b72nil
Tb4b4b4}

Tff7b72func Te6edf3lodLevelHandlerTb4b4b4(Te6edf3_ Te6edf3jsTb4b4b4.Te6edf3ValueTb4b4b4, Te6edf3args Tb4b4b4[Tb4b4b4]Te6edf3jsTb4b4b4.Te6edf3ValueTb4b4b4) Tffa657any Tb4b4b4{
Tff7b72if Tffa657lenTb4b4b4(Te6edf3argsTb4b4b4) Tff7b72== T79c0ff0 Tff7b72|| Te6edf3argsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4.Te6edf3TypeTb4b4b4(Tb4b4b4) Tff7b72!= Te6edf3jsTb4b4b4.Te6edf3TypeNumber Tb4b4b4{
Tff7b72return Ta5d6ff"high"
Tb4b4b4}
Tff7b72return Te6edf3lodTb4b4b4.Te6edf3LevelFromScaleTb4b4b4(Te6edf3argsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4.Te6edf3FloatTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}

Tff7b72func Te6edf3sceneSetHandlerTb4b4b4(Te6edf3args Tb4b4b4[Tb4b4b4]Te6edf3jsTb4b4b4.Te6edf3ValueTb4b4b4) Tb4b4b4(Tffa657anyTb4b4b4, Tffa657errorTb4b4b4) Tb4b4b4{
Tff7b72var Te6edf3req Te6edf3sceneTb4b4b4.Te6edf3SetRequest
Tff7b72if Te6edf3err Tff7b72:= Te6edf3readJSONArgTb4b4b4(Te6edf3argsTb4b4b4, T79c0ff0Tb4b4b4, Tff7b72&Te6edf3reqTb4b4b4)Tb4b4b4; Te6edf3err Tff7b72!= Tff7b72nil Tb4b4b4{
Tff7b72return Tff7b72nilTb4b4b4, Te6edf3err
Tb4b4b4}
Te6edf3visualiserSceneTb4b4b4.Te6edf3SetTb4b4b4(Te6edf3reqTb4b4b4)
Te6edf3nTb4b4b4, Te6edf3e Tff7b72:= Te6edf3visualiserSceneTb4b4b4.Te6edf3CountsTb4b4b4(Tb4b4b4)
Tff7b72return Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tffa657anyTb4b4b4{Ta5d6ff"ok"Tb4b4b4: Tff7b72trueTb4b4b4, Ta5d6ff"nodes"Tb4b4b4: Te6edf3nTb4b4b4, Ta5d6ff"edges"Tb4b4b4: Te6edf3eTb4b4b4}Tb4b4b4, Tff7b72nil
Tb4b4b4}

Tff7b72func Te6edf3sceneTickHandlerTb4b4b4(Te6edf3_ Te6edf3jsTb4b4b4.Te6edf3ValueTb4b4b4, Te6edf3args Tb4b4b4[Tb4b4b4]Te6edf3jsTb4b4b4.Te6edf3ValueTb4b4b4) Tffa657any Tb4b4b4{
Te6edf3steps Tff7b72:= T79c0ff2
Tff7b72if Tffa657lenTb4b4b4(Te6edf3argsTb4b4b4) Tb4b4b4> T79c0ff0 Tff7b72&& Te6edf3argsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4.Te6edf3TypeTb4b4b4(Tb4b4b4) Tff7b72== Te6edf3jsTb4b4b4.Te6edf3TypeNumber Tb4b4b4{
Te6edf3steps Tb4b4b4= Tffa657intTb4b4b4(Te6edf3argsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4.Te6edf3IntTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Te6edf3visualiserSceneTb4b4b4.Te6edf3TickTb4b4b4(Te6edf3stepsTb4b4b4)
Tff7b72return Tff7b72nil
Tb4b4b4}

Tff7b72func Te6edf3sceneResizeHandlerTb4b4b4(Te6edf3_ Te6edf3jsTb4b4b4.Te6edf3ValueTb4b4b4, Te6edf3args Tb4b4b4[Tb4b4b4]Te6edf3jsTb4b4b4.Te6edf3ValueTb4b4b4) Tffa657any Tb4b4b4{
Tff7b72if Tffa657lenTb4b4b4(Te6edf3argsTb4b4b4) Tb4b4b4< T79c0ff2 Tb4b4b4{
Tff7b72return Tff7b72nil
Tb4b4b4}
Te6edf3visualiserSceneTb4b4b4.Te6edf3ResizeTb4b4b4(Te6edf3argsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4.Te6edf3FloatTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3argsTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4.Te6edf3FloatTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72return Tff7b72nil
Tb4b4b4}

Tff7b72func Te6edf3sceneSetCameraHandlerTb4b4b4(Te6edf3_ Te6edf3jsTb4b4b4.Te6edf3ValueTb4b4b4, Te6edf3args Tb4b4b4[Tb4b4b4]Te6edf3jsTb4b4b4.Te6edf3ValueTb4b4b4) Tffa657any Tb4b4b4{
Tff7b72if Tffa657lenTb4b4b4(Te6edf3argsTb4b4b4) Tb4b4b4< T79c0ff3 Tb4b4b4{
Tff7b72return Tff7b72nil
Tb4b4b4}
Te6edf3visualiserSceneTb4b4b4.Te6edf3SetCameraTb4b4b4(Te6edf3argsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4.Te6edf3FloatTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3argsTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4.Te6edf3FloatTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3argsTb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4.Te6edf3FloatTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72return Tff7b72nil
Tb4b4b4}

Tff7b72func Te6edf3scenePanByHandlerTb4b4b4(Te6edf3_ Te6edf3jsTb4b4b4.Te6edf3ValueTb4b4b4, Te6edf3args Tb4b4b4[Tb4b4b4]Te6edf3jsTb4b4b4.Te6edf3ValueTb4b4b4) Tffa657any Tb4b4b4{
Tff7b72if Tffa657lenTb4b4b4(Te6edf3argsTb4b4b4) Tb4b4b4< T79c0ff2 Tb4b4b4{
Tff7b72return Tff7b72nil
Tb4b4b4}
Te6edf3visualiserSceneTb4b4b4.Te6edf3PanByTb4b4b4(Te6edf3argsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4.Te6edf3FloatTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3argsTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4.Te6edf3FloatTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72return Tff7b72nil
Tb4b4b4}

Tff7b72func Te6edf3sceneZoomAtHandlerTb4b4b4(Te6edf3_ Te6edf3jsTb4b4b4.Te6edf3ValueTb4b4b4, Te6edf3args Tb4b4b4[Tb4b4b4]Te6edf3jsTb4b4b4.Te6edf3ValueTb4b4b4) Tffa657any Tb4b4b4{
Tff7b72if Tffa657lenTb4b4b4(Te6edf3argsTb4b4b4) Tb4b4b4< T79c0ff3 Tb4b4b4{
Tff7b72return Tff7b72nil
Tb4b4b4}
Te6edf3visualiserSceneTb4b4b4.Te6edf3ZoomAtTb4b4b4(Te6edf3argsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4.Te6edf3FloatTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3argsTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4.Te6edf3FloatTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3argsTb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4.Te6edf3FloatTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72return Tff7b72nil
Tb4b4b4}

Tff7b72func Te6edf3scenePickHandlerTb4b4b4(Te6edf3_ Te6edf3jsTb4b4b4.Te6edf3ValueTb4b4b4, Te6edf3args Tb4b4b4[Tb4b4b4]Te6edf3jsTb4b4b4.Te6edf3ValueTb4b4b4) Tffa657any Tb4b4b4{
Tff7b72if Tffa657lenTb4b4b4(Te6edf3argsTb4b4b4) Tb4b4b4< T79c0ff2 Tb4b4b4{
Tff7b72return Ta5d6ff""
Tb4b4b4}
Te6edf3maxDist Tff7b72:= T79c0ff14.0
Tff7b72if Tffa657lenTb4b4b4(Te6edf3argsTb4b4b4) Tb4b4b4> T79c0ff2 Tff7b72&& Te6edf3argsTb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4.Te6edf3TypeTb4b4b4(Tb4b4b4) Tff7b72== Te6edf3jsTb4b4b4.Te6edf3TypeNumber Tb4b4b4{
Te6edf3maxDist Tb4b4b4= Te6edf3argsTb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4.Te6edf3FloatTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tff7b72return Te6edf3visualiserSceneTb4b4b4.Te6edf3PickNearestTb4b4b4(Te6edf3argsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4.Te6edf3FloatTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3argsTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4.Te6edf3FloatTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3maxDistTb4b4b4)
Tb4b4b4}

Tff7b72func Te6edf3sceneDragStartHandlerTb4b4b4(Te6edf3_ Te6edf3jsTb4b4b4.Te6edf3ValueTb4b4b4, Te6edf3args Tb4b4b4[Tb4b4b4]Te6edf3jsTb4b4b4.Te6edf3ValueTb4b4b4) Tffa657any Tb4b4b4{
Tff7b72if Tffa657lenTb4b4b4(Te6edf3argsTb4b4b4) Tb4b4b4< T79c0ff1 Tb4b4b4{
Tff7b72return Tff7b72false
Tb4b4b4}
Tff7b72return Te6edf3visualiserSceneTb4b4b4.Te6edf3DragStartTb4b4b4(Te6edf3argsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4.Te6edf3StringTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}

Tff7b72func Te6edf3sceneDragToHandlerTb4b4b4(Te6edf3_ Te6edf3jsTb4b4b4.Te6edf3ValueTb4b4b4, Te6edf3args Tb4b4b4[Tb4b4b4]Te6edf3jsTb4b4b4.Te6edf3ValueTb4b4b4) Tffa657any Tb4b4b4{
Tff7b72if Tffa657lenTb4b4b4(Te6edf3argsTb4b4b4) Tb4b4b4< T79c0ff2 Tb4b4b4{
Tff7b72return Tff7b72nil
Tb4b4b4}
Te6edf3visualiserSceneTb4b4b4.Te6edf3DragToTb4b4b4(Te6edf3argsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4.Te6edf3FloatTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3argsTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4.Te6edf3FloatTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72return Tff7b72nil
Tb4b4b4}

Tff7b72func Te6edf3sceneDragEndHandlerTb4b4b4(Te6edf3_ Te6edf3jsTb4b4b4.Te6edf3ValueTb4b4b4, Te6edf3_ Tb4b4b4[Tb4b4b4]Te6edf3jsTb4b4b4.Te6edf3ValueTb4b4b4) Tffa657any Tb4b4b4{
Te6edf3visualiserSceneTb4b4b4.Te6edf3DragEndTb4b4b4(Tb4b4b4)
Tff7b72return Tff7b72nil
Tb4b4b4}

Tff7b72func Te6edf3sceneGetCameraHandlerTb4b4b4(Te6edf3_ Tb4b4b4[Tb4b4b4]Te6edf3jsTb4b4b4.Te6edf3ValueTb4b4b4) Tb4b4b4(Tffa657anyTb4b4b4, Tffa657errorTb4b4b4) Tb4b4b4{
Te6edf3cam Tff7b72:= Te6edf3visualiserSceneTb4b4b4.Te6edf3CameraTb4b4b4(Tb4b4b4)
Tff7b72return Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tffa657anyTb4b4b4{Ta5d6ff"ok"Tb4b4b4: Tff7b72trueTb4b4b4, Ta5d6ff"x"Tb4b4b4: Te6edf3camTb4b4b4.Te6edf3XTb4b4b4, Ta5d6ff"y"Tb4b4b4: Te6edf3camTb4b4b4.Te6edf3YTb4b4b4, Ta5d6ff"zoom"Tb4b4b4: Te6edf3camTb4b4b4.Te6edf3ZoomTb4b4b4}Tb4b4b4, Tff7b72nil
Tb4b4b4}

Tff7b72func Te6edf3sceneGetPositionsHandlerTb4b4b4(Te6edf3_ Tb4b4b4[Tb4b4b4]Te6edf3jsTb4b4b4.Te6edf3ValueTb4b4b4) Tb4b4b4(Tffa657anyTb4b4b4, Tffa657errorTb4b4b4) Tb4b4b4{
Te6edf3pos Tff7b72:= Te6edf3visualiserSceneTb4b4b4.Te6edf3PositionsMapTb4b4b4(Tb4b4b4)
Te6edf3out Tff7b72:= Tffa657makeTb4b4b4(Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tffa657anyTb4b4b4, Tffa657lenTb4b4b4(Te6edf3posTb4b4b4)Tb4b4b4)
Tff7b72for Te6edf3idTb4b4b4, Te6edf3xy Tff7b72:= Tff7b72range Te6edf3pos Tb4b4b4{
Te6edf3outTb4b4b4[Te6edf3idTb4b4b4] Tb4b4b4= Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tffa657anyTb4b4b4{Ta5d6ff"x"Tb4b4b4: Te6edf3xyTb4b4b4.Te6edf3XTb4b4b4, Ta5d6ff"y"Tb4b4b4: Te6edf3xyTb4b4b4.Te6edf3YTb4b4b4}
Tb4b4b4}
Tff7b72return Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tffa657anyTb4b4b4{Ta5d6ff"ok"Tb4b4b4: Tff7b72trueTb4b4b4, Ta5d6ff"positions"Tb4b4b4: Te6edf3outTb4b4b4}Tb4b4b4, Tff7b72nil
Tb4b4b4}

Tff7b72func Te6edf3sceneCountsHandlerTb4b4b4(Te6edf3_ Tb4b4b4[Tb4b4b4]Te6edf3jsTb4b4b4.Te6edf3ValueTb4b4b4) Tb4b4b4(Tffa657anyTb4b4b4, Tffa657errorTb4b4b4) Tb4b4b4{
Te6edf3nTb4b4b4, Te6edf3e Tff7b72:= Te6edf3visualiserSceneTb4b4b4.Te6edf3CountsTb4b4b4(Tb4b4b4)
Tff7b72return Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tffa657anyTb4b4b4{Ta5d6ff"ok"Tb4b4b4: Tff7b72trueTb4b4b4, Ta5d6ff"nodes"Tb4b4b4: Te6edf3nTb4b4b4, Ta5d6ff"edges"Tb4b4b4: Te6edf3eTb4b4b4}Tb4b4b4, Tff7b72nil
Tb4b4b4}

Tff7b72func Te6edf3float32ToJSTb4b4b4(Te6edf3data Tb4b4b4[Tb4b4b4]Tffa657float32Tb4b4b4) Te6edf3jsTb4b4b4.Te6edf3Value Tb4b4b4{
Tff7b72if Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4) Tff7b72== T79c0ff0 Tb4b4b4{
Tff7b72return Te6edf3jsTb4b4b4.Te6edf3GlobalTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3GetTb4b4b4(Ta5d6ff"Float32Array"Tb4b4b4)Tb4b4b4.Te6edf3NewTb4b4b4(T79c0ff0Tb4b4b4)
Tb4b4b4}
Te6edf3byteLen Tff7b72:= Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4) Tff7b72* T79c0ff4
Te6edf3u8 Tff7b72:= Te6edf3jsTb4b4b4.Te6edf3GlobalTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3GetTb4b4b4(Ta5d6ff"Uint8Array"Tb4b4b4)Tb4b4b4.Te6edf3NewTb4b4b4(Te6edf3byteLenTb4b4b4)
Te6edf3src Tff7b72:= Te6edf3unsafeTb4b4b4.Te6edf3SliceTb4b4b4(Tb4b4b4(Tff7b72*Tffa657byteTb4b4b4)Tb4b4b4(Te6edf3unsafeTb4b4b4.Te6edf3PointerTb4b4b4(Tff7b72&Te6edf3dataTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)Tb4b4b4)Tb4b4b4, Te6edf3byteLenTb4b4b4)
Te6edf3jsTb4b4b4.Te6edf3CopyBytesToJSTb4b4b4(Te6edf3u8Tb4b4b4, Te6edf3srcTb4b4b4)
Tff7b72return Te6edf3jsTb4b4b4.Te6edf3GlobalTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3GetTb4b4b4(Ta5d6ff"Float32Array"Tb4b4b4)Tb4b4b4.Te6edf3NewTb4b4b4(Te6edf3u8Tb4b4b4.Te6edf3GetTb4b4b4(Ta5d6ff"buffer"Tb4b4b4)Tb4b4b4)
Tb4b4b4}

Tff7b72func Te6edf3sceneGetDrawBuffersHandlerTb4b4b4(Te6edf3_ Te6edf3jsTb4b4b4.Te6edf3ValueTb4b4b4, Te6edf3_ Tb4b4b4[Tb4b4b4]Te6edf3jsTb4b4b4.Te6edf3ValueTb4b4b4) Tffa657any Tb4b4b4{
Te6edf3nodeDrawScratch Tb4b4b4= Te6edf3visualiserSceneTb4b4b4.Te6edf3PackNodesTb4b4b4(Te6edf3nodeDrawScratchTb4b4b4)
Te6edf3edgeDrawScratch Tb4b4b4= Te6edf3visualiserSceneTb4b4b4.Te6edf3PackEdgesTb4b4b4(Te6edf3edgeDrawScratchTb4b4b4)
Te6edf3cam Tff7b72:= Te6edf3visualiserSceneTb4b4b4.Te6edf3CameraTb4b4b4(Tb4b4b4)
Te6edf3nTb4b4b4, Te6edf3_ Tff7b72:= Te6edf3visualiserSceneTb4b4b4.Te6edf3CountsTb4b4b4(Tb4b4b4)
Te6edf3obj Tff7b72:= Te6edf3jsTb4b4b4.Te6edf3GlobalTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3GetTb4b4b4(Ta5d6ff"Object"Tb4b4b4)Tb4b4b4.Te6edf3NewTb4b4b4(Tb4b4b4)
Te6edf3objTb4b4b4.Te6edf3SetTb4b4b4(Ta5d6ff"ok"Tb4b4b4, Tff7b72trueTb4b4b4)
Te6edf3objTb4b4b4.Te6edf3SetTb4b4b4(Ta5d6ff"nodes"Tb4b4b4, Te6edf3float32ToJSTb4b4b4(Te6edf3nodeDrawScratchTb4b4b4)Tb4b4b4)
Te6edf3objTb4b4b4.Te6edf3SetTb4b4b4(Ta5d6ff"edges"Tb4b4b4, Te6edf3float32ToJSTb4b4b4(Te6edf3edgeDrawScratchTb4b4b4)Tb4b4b4)
Te6edf3objTb4b4b4.Te6edf3SetTb4b4b4(Ta5d6ff"nodeCount"Tb4b4b4, Te6edf3nTb4b4b4)
Te6edf3objTb4b4b4.Te6edf3SetTb4b4b4(Ta5d6ff"edgeCount"Tb4b4b4, Tffa657lenTb4b4b4(Te6edf3edgeDrawScratchTb4b4b4)Tff7b72/Te6edf3sceneTb4b4b4.Te6edf3EdgeStrideTb4b4b4)
Te6edf3objTb4b4b4.Te6edf3SetTb4b4b4(Ta5d6ff"camX"Tb4b4b4, Te6edf3camTb4b4b4.Te6edf3XTb4b4b4)
Te6edf3objTb4b4b4.Te6edf3SetTb4b4b4(Ta5d6ff"camY"Tb4b4b4, Te6edf3camTb4b4b4.Te6edf3YTb4b4b4)
Te6edf3objTb4b4b4.Te6edf3SetTb4b4b4(Ta5d6ff"zoom"Tb4b4b4, Te6edf3camTb4b4b4.Te6edf3ZoomTb4b4b4)
Tff7b72return Te6edf3obj
Tb4b4b4}


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────